import axios from 'axios';

const api = axios.create({
  baseURL: '/api',
  timeout: 5000,
  headers: {
    'Content-Type': 'application/json; charset=UTF-8',
    'Accept': 'application/json'
  }
});

// 请求拦截器
api.interceptors.request.use(config => {
  // 获取token
  const token = localStorage.getItem('token');
  
  // 添加Authorization头
  if (token) {
    // 确保token不包含非ASCII字符
    const cleanToken = token.replace(/[^\x00-\x7F]/g, "");
    config.headers.Authorization = `Bearer ${cleanToken}`;
  }
  
  // 处理请求数据
  if (config.data) {
    // 确保请求数据是JSON格式
    if (typeof config.data === 'object') {
      config.data = JSON.stringify(config.data);
    }
    
    // 对数据进行编码处理
    if (config.transformRequest) {
      config.transformRequest = [].concat(config.transformRequest);
    } else {
      config.transformRequest = [];
    }
    
    config.transformRequest.push(data => {
      try {
        return encodeURIComponent(data);
      } catch (e) {
        return data;
      }
    });
  }
  
  return config;
}, error => {
  console.error('请求拦截器出错:', error);
  return Promise.reject(error);
});

// 响应拦截器
api.interceptors.response.use(
  response => {
    // 处理成功响应
    if (response.data && typeof response.data === 'string') {
      try {
        response.data = JSON.parse(response.data);
      } catch (e) {
        console.warn('响应数据解析失败:', e);
      }
    }
    return response.data;
  },
  error => {
    // 处理错误响应
    if (error.response) {
      switch (error.response.status) {
        case 401:
          // 未授权，跳转到登录页
          localStorage.removeItem('token');
          window.location.href = '/login';
          break;
        case 403:
          error.message = '拒绝访问';
          break;
        case 404:
          error.message = '请求资源不存在';
          break;
        case 500:
          error.message = '服务器内部错误';
          break;
        default:
          error.message = `连接错误 ${error.response.status}`;
      }
    } else {
      error.message = '连接到服务器失败';
    }
    
    console.error('请求失败:', error.message);
    return Promise.reject(error);
  }
);

export default api;